#ifndef FASTXML_H
#define FASTXML_H

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// XML节点类型
typedef enum {
    XML_NODE_ELEMENT,
    XML_NODE_TEXT,
    XML_NODE_COMMENT,
    XML_NODE_CDATA
} xml_node_type_t;

// XML属性结构
typedef struct xml_attribute {
    char *name;
    char *value;
    struct xml_attribute *next;
} xml_attribute_t;

// XML节点结构
typedef struct xml_node {
    xml_node_type_t type;
    char *name;
    char *content;
    xml_attribute_t *attributes;
    struct xml_node *parent;
    struct xml_node *children;
    struct xml_node *next;
} xml_node_t;

// XML文档结构
typedef struct {
    xml_node_t *root;
    char *version;
    char *encoding;
} xml_document_t;

// 函数声明
xml_document_t* xml_parse_file(const char *filename);
xml_document_t* xml_parse_string(const char *xml_string);
void xml_free_document(xml_document_t *doc);
void xml_free_node(xml_node_t *node);

xml_node_t* xml_find_node(xml_node_t *parent, const char *name);
xml_node_t* xml_find_node_by_attribute(xml_node_t *parent, const char *attr_name, const char *attr_value);
const char* xml_get_attribute(xml_node_t *node, const char *attr_name);
const char* xml_get_node_content(xml_node_t *node);

xml_node_t* xml_create_node(xml_node_type_t type, const char *name, const char *content);
xml_attribute_t* xml_create_attribute(const char *name, const char *value);
void xml_add_attribute(xml_node_t *node, xml_attribute_t *attr);
void xml_add_child(xml_node_t *parent, xml_node_t *child);

void xml_print_document(xml_document_t *doc, FILE *output);
void xml_print_node(xml_node_t *node, FILE *output, int indent);

// 辅助函数
char* xml_trim_whitespace(char *str);
char* xml_decode_entities(const char *str);
int xml_is_valid_name(const char *name);

#endif // FASTXML_H